Dado que PHP usa las funciones de C de bajo nivel para las operaciones relacionadas con el sistema de archivos, puede que los bytes nulos sean gestionados de una forma inesperada. Debido a que los bytes nulos denotan el final de una cadena en C, las cadenas que los contienen no serán consideradas en su totalidad, sino únicamente hasta que ocurre un byte nulo. El siguiente ejemplo muestra un segmento de código vulnerable que demuestra este problema:
Example #1 Script vulnerable a bytes nulos
<?php
$archivo = $_GET['archivo']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$archivo.'.php')) {
// file_exists devolverá true ya que el archivo /home/wwwrun/../../etc/passwd existe
include '/home/wwwrun/'.$archivo.'.php';
// el archivo /etc/passwd será incluido
}
?>
Por lo tanto, cualquier cadena que sea usada en una operación del sistema de archivos debe ser validada apropiadamente siempre. He aquí una versión mejor del ejemplo anterior:
Example #2 Validación correcta de la entrada
<?php
$archivo = $_GET['archivo'];
// Lista de valores correctos posibles
switch ($archivo) {
case 'principal':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$archivo.'.php';
break;
default:
include '/home/wwwrun/include/principal.php';
}
?>